//
//  RDeliverySDKSettings.h
//  RDelivery
//
//  Created by selmerzhang on 2021/8/5.
//  Copyright © 2021 Tencent. All rights reserved.
//

#ifndef RDeliverySDKSettings_h
#define RDeliverySDKSettings_h

#import <Foundation/Foundation.h>
#import "RDeliveryDependProtocol.h"
#import "RDConfigServerJsonModel.h"



typedef NS_OPTIONS(NSUInteger, RDConfigUpdateMode) {
    RDCONFIG_UPDATE_MODE_NONE = 0,               //不自动更新
    RDCONFIG_UPDATE_MODE_APP_START = 1<<0,           //sdk初始化时更新，切换账号或环境后更新
    RDCONFIG_UPDATE_MODE_SCHEDUAL = 1<<1,            //app定时更新
    RDCONFIG_UPDATE_MODE_ENTER_FOREGROUND = 1<<2,    //app进入前台时更新(macOS不建议设置！)
    RDCONFIG_UPDATE_MODE_NETWORK_CHANGE = 1<<3,      //app切换网络时更新
    RDCONFIG_UPDATE_MODE_ALL = RDCONFIG_UPDATE_MODE_APP_START | RDCONFIG_UPDATE_MODE_SCHEDUAL
                               | RDCONFIG_UPDATE_MODE_ENTER_FOREGROUND | RDCONFIG_UPDATE_MODE_NETWORK_CHANGE,
};

NS_ASSUME_NONNULL_BEGIN

//正式环境ID
FOUNDATION_EXPORT NSString * const RDeliveryReleaseEnvId;
//系统创建的默认测试环境ID
FOUNDATION_EXPORT NSString * const RDeliveryTestEnvId;

// 上报 SDK 解包、解密等异常信息
FOUNDATION_EXPORT NSString * const RDeliverySDKReportPath;

// 拉取配置（加密+回包优化+批量聚合）
FOUNDATION_EXPORT NSString * const RDeliveryPullConfigServiceV4Path;

@interface RDeliverySDKSettings : NSObject

/// appid
@property (nonatomic, copy, readonly) NSString *appId;

/// systemId 用于不同的上层SDK，如ResHub，RFix等
@property (nonatomic, copy, readonly) NSString *systemId;

/// 业务appkey
@property (nonatomic, copy, readonly) NSString *appKey;

/// 业务app版本
@property(atomic, copy, nullable) NSString *appVersion;

/// 环境ID，当使用环境ID时，配置会优先拉取该环境下的配置，该环境下不存在的配置Key，则会拉取正式环境的对应Key
@property(nonatomic, copy) NSString *envId;

/// 业务方set名称，独立部署时才需要设置，设置前请先跟shiply后台申请独立set
@property(nonatomic, copy) NSString *businessSetName;

/// 设备id，上报使用
@property(atomic, copy, nullable) NSString *qimei;

/// 分流标识，用户id
@property (atomic, copy, nullable) NSString *guid;

/// 系统版本，因为隐私合规问题，改为业务方注入
@property (atomic, copy, nullable) NSString *systemVersion;

/// 手机型号，因为隐私合规问题，改为业务方注入
@property (atomic, copy, nullable) NSString *deviceType;

/// 请求超时时间，默认15s
@property (nonatomic, assign) NSTimeInterval timeout;

/// 定时拉取间隔时间，默认4小时，不能低于10分钟
@property (nonatomic, assign) NSTimeInterval updateDuration;

/// 配置更新的策略，默认为RDCONFIG_UPDATE_MODE_ALL
@property(atomic, assign) RDConfigUpdateMode updateMode;

/// 自动更新的限频时间间隔，限制的时间间隔内，updateMode定义的自动拉取最多触发一次
@property(nonatomic, assign) NSTimeInterval autoUpdateLimit;

/// 平台类型：iOS/iPad
@property (nonatomic, assign) RDConfigServerPlatform platform;

/// 用户自定义标签 举例 渠道，模块等
@property (atomic, copy, nullable) NSDictionary<NSString *, NSString *> *profiles;

/// 首次读取后下次读取和首次读取的值始终保持一致的key的集合，App重新启动后才能读取到最新的值
/// 适用于部分配置需要在整个app生命周期内体验保持一致的场景
@property (atomic, copy, nullable) NSSet<NSString *> *fixedAfterHitKeys;

/// 是否是debug包，设置为YES后，任务在体验中阶段时，如果在web端体验名单中勾选了“体验包用户默认为体验号码”，则应用体验号码的命中规则
@property(nonatomic, assign) BOOL isDebugPackage;

/// 是否记录配置拉取时间（默认不记录）
@property(nonatomic, assign) BOOL isRecordPullTime;

/// 设置SDK实例是按项目级别拉取还是按app级别（产品级别）拉取，默认为项目级别
/// 仅在初始化SDKSetting的时候设置这个属性，在调用 createSDKWithSettings 初始化SDK实例后，不要再修改这个属性
/// 目前仅资源系统reshub会使用这个属性，其他业务不要设置这个属性
@property(nonatomic, assign) RDConfigServerPullTarget pullTarget;

/// 生成一个RDeliverySDKSettings
/// @param appId 业务appID 不能为空
/// @param appKey 业务appKey
/// @param guid 业务guid
/// @param depends 用户注入功能模块实现
+ (instancetype)settingWithAppId:(NSString *)appId
                          appKey:(NSString *)appKey
                            guid:(nullable NSString *)guid
                         depends:(id<RDeliveryDependProtocol>)depends;

/// 生成一个RDeliverySDKSettings
/// @param appId 业务appID 不能为空
/// @param systemId 系统ID  用于不同的上层SDK，如ResHub，RFix等
/// @param appKey 业务鉴权appKey
/// @param guid 业务guid
/// @param depends 用户注入功能模块实现
+ (instancetype)settingWithAppId:(NSString *)appId
                        systemId:(NSString *)systemId
                          appKey:(NSString *)appKey
                            guid:(nullable NSString *)guid
                         depends:(id<RDeliveryDependProtocol>)depends;

/// 生成一个RDeliverySDKSettings
/// @param appId 业务appID 不能为空
/// @param systemId 系统ID  用于不同的上层SDK，如ResHub，RFix等
/// @param appKey 业务鉴权appKey
/// @param guid 业务guid
/// @param envId 环境ID，当使用环境ID时，配置会优先拉取该环境下的配置，该环境下不存在的配置Key，则会拉取正式环境的对应Key。不填时默认为正式环境
/// @param depends 用户注入功能模块实现
+ (instancetype)settingWithAppId:(NSString *)appId
                        systemId:(NSString *)systemId
                          appKey:(NSString *)appKey
                            guid:(nullable NSString *)guid
                          envId:(nullable NSString *)envId
                         depends:(id<RDeliveryDependProtocol>)depends;

#pragma mark - Settings
/// 设置自定义标签
/// @param key 标签的key值
/// @param value 标签的value值
- (void)setProfileValue:(NSString * _Nullable)value forKey:(NSString *)key;

@end

NS_ASSUME_NONNULL_END

#endif /* RDeliverySDKSettings_h */
